/**
 * 
 */
package org.stars.util.diagnostic;

import java.util.LinkedList;
import java.util.List;

/**
 * Helper creato per fornire lo stack trace nella modalità definita dal diagnostic Handler.
 * 
 * @author Francesco Benincasa (908099)
 * 
 */
public abstract class StackTraceDiagnosticHelper {
	/**
	 * @param stackTraceDiagnosticHandler
	 * @return
	 */
	public static List<String> getStackInfoList(StackTraceDiagnosticHandler stackTraceDiagnosticHandler) {
		LinkedList<String> lista = new LinkedList<String>();
		String sApp;
		int fase = 0;
		StackTraceElement array[] = Thread.currentThread().getStackTrace();

		if (array != null && array.length > stackTraceDiagnosticHandler.getLowerBoundIndex()) {
			for (int i = stackTraceDiagnosticHandler.getLowerBoundIndex(); i < stackTraceDiagnosticHandler.getUpperBoundIndex() && i < array.length && fase != 2; i++) {

				// se fuori range usciamo
				if (i >= stackTraceDiagnosticHandler.getUpperBoundIndex()) {
					break;
				}

				// fase 0 = non stiamo visualizzando nulla
				if (fase == 0) {
					if (stackTraceDiagnosticHandler.canBeginDisplay(i, array[i])) {
						fase = 1;
					}
				}

				// fase 1 = stiamo visualizzando ma stiamo
				// aspettando condizione per uscire
				if (fase == 1) {
					sApp = stackTraceDiagnosticHandler.getStringToDisplay(i, array[i]);
					if (stackTraceDiagnosticHandler.canStopDisplay(i, array[i])) {
						fase = 2;
					} else {
						lista.addLast(sApp);
					}

				}
			}
		}

		return lista;

	}
}
